<?php

declare(strict_types=1);

namespace app\common\model;

use think\Model;
use think\model\concern\SoftDelete;
use think\facade\Db;
use app\common\model\AdminRole as AdminRoleModel;


class Admin extends Model
{
    use SoftDelete;

    protected $pk = 'admin_id';
    protected $name = 'admin';

    // 自动时间戳类型
    protected $autoWriteTimestamp = true;

    // 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
    protected $deleteTime = 'delete_time';

    // 默认头像
    const DEFAULT_AVATAR = 'https://i.gtimg.cn/club/item/face/img/2/16022_100.gif';

    /**
     * 根据用户名获取管理员信息
     * @param string $username
     * @return array|Model|null
     */
    public function getAdminByUsername(string $username)
    {
        return $this->where('username', $username)
            ->where('status', 1)
            ->whereNull('delete_time')
            ->find();
    }

    /**
     * 获取头像（自动处理默认头像）
     * @param string $value
     * @return string
     */
    public function getAvatarAttr($value)
    {
        return $value ?: self::DEFAULT_AVATAR;
    }

    /**
     * 定义与角色的关联关系
     */
    public function roles()
    {
        return $this->hasMany(AdminRoleModel::class, 'admin_id', 'admin_id')
            ->with(['role' => function ($query) {
                $query->field('role_id,name,code');
            }]);
    }

    /**
     * 获取管理员的所有角色
     * @param int $adminId
     * @return array
     */
    public function getAdminRoles(int $adminId): array
    {
        return Db::name('admin_role')
            ->alias('ar')
            ->join('role r', 'r.role_id = ar.role_id')
            ->where('ar.admin_id', $adminId)
            ->where('r.status', 1)
            ->column('r.code');
    }
    /**
     * 更新管理员登录信息
     * @param int $adminId
     * @param string $lastLoginIp
     * @return bool
     */
    public function updateLoginInfo(int $adminId, string $lastLoginIp): bool
    {
        return (bool) $this->where('admin_id', $adminId)->update([
            'last_login_time' => date('Y-m-d H:i:s'),
            'last_login_ip' => $lastLoginIp
        ]);
    }

    /**
     * 获取管理员的所有权限
     * @param int $adminId
     * @return array
     */
    public function getAdminPermissions(int $adminId): array
    {
        // 获取管理员的角色ID
        $roleIds = Db::name('admin_role')
            ->where('admin_id', $adminId)
            ->column('role_id');

        if (empty($roleIds)) {
            return [];
        }

        // 获取角色对应的菜单ID
        $menuIds = Db::name('role_menu')
            ->whereIn('role_id', $roleIds)
            ->column('menu_id');

        if (empty($menuIds)) {
            return [];
        }

        // 获取菜单的权限标识
        return Db::name('menu')
            ->whereIn('menu_id', $menuIds)
            ->where('status', 1)
            ->whereNotNull('perms')
            ->where('perms', '<>', '')
            ->column('perms');
    }
}
